# 访问控制

# package

  • package语句作为Java源文件除注释外的第一条语句,指明该文件中定义的类所在的包(若缺省该语句,则指定为无名包)

  • 用处:

    • 包帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
    • 包可以包含类和子包,划分项目层次,便于管理
    • 解决类命名冲突的问题
    • 控制访问权限
  • JDK中主要的包:

    • java.lang----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
    • java.util----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
    • java.io ----包含能提供多种输入/输出功能的类。
    • java.net----包含执行与网络相关的操作的类和接口。
    • java.text----包含了一些java格式化相关的类
    • java.sql----包含了java进行JDBC数据库编程的相关类/接口
  • 生成与包名对应目录(目录中可以是绝对地址、相对地址、“.”可以表示当前目录),运行时要加上包名

    javac -d [目录] Hello.java
    cd 目录
    java cn.itcast.chapter01.Hello
    

# import

  • 为使用定义在不同包中的Java类,需用import语句来引入指定包层次下所需要的类或全部类(.*)。import语句告诉编译器到哪里去寻找类。import一般出现在package后,类定义之前
  • 注意:
    • 在源文件中使用import显式的导入指定包下的类或接口

    • 声明在包的声明和类的声明之间。

    • 如果需要导入多个类或接口,那么就并列显式多个import语句即可

    • 如果在代码中使用不同包下的同名的类。那么就需要使用类的全类名的方式指明调用的是哪个类。

    • 已经导入java.lang包下的类。那么如果需要使用其子包下的类的话,仍然需要导入

    • 静态导入(static import):调用指定类或接口下的静态的属性或方法,之后可以直接使用而无需写类名

      // 如下仅为示例
      import static com.example.demo.Tools.add;
      
      public static void main(String[] args) {
        int add = add(1, 2);
      }
      

# 权限修饰符

访问范围 private default protected public
同一类
同一包
不同包的子类
同一工程
  • private(类访问级别):除了类本身和类内部的成员,外界无法直接访问该元素。private 是类和调用者之间的屏障。任何试图访问私有成员的行为都会报编译时错误;
  • default(包访问级别):类或类成员没有修饰符为默认访问级别,该权限下的资源可以被同一包(库组件)中其他类的成员访问
  • protected(子类访问级别):被修饰的类成员能被本包中其他类不同包中该类子类访问
  • public(公共访问级别):类或类成员能被所有都能访问

TIP

外部类即 class 的修饰符只能是 public 或 默认

类的成员(属性、方法、构造器、内部类)的权限修饰符可以是以上四种

一个Java文件中可以有多个类,但是 public 修饰的只能有一个,且类名和文件名一致!

# jar

  • Java Archive File,Java档案文件,是一种压缩文件,独立于任何操作系统。操作步骤如下:

    1. 编译生成与包名对应目录的class文件

      java -d . Hello.java
      
    2. 利用jar命令将cn及其目录下的文件都压缩成jar包

      jar -cvf Hello.jar cn
      
    3. 由于目前jar包中没有主清单属性,修改jar包META-INFMANIFEST.MF文件,指定main方法所在类

      Main-Class: cn.itcast.chapter01.Hello	//注意“:”后有空格
      
    4. 运行jar包

      java -jar Hello.jar
      
    5. 解压jar包

      jar -xvf Hello.jar